Object Oriented Programming

Posted by Max Lin on 2021-06-12

類別(Class)與物件(Object)

類別

類別就像一個抽象空間,你可以把想像到的成員都定義在類別裡面,包含屬性、方法...等,可以想像一個「」的類別,而在想像的空間裡你想怎麼變化都行。例如:定義車有 20 個輪子還是車可以有飛的動作,任何的抽象想法都可以藉由類別去定義,由你自行發揮。
Ex:

關於類別成員的定義
屬性:類別原生的產物。就像人類的四肢跟五官屬於原生的,而四肢、五官就是人類的屬性。
方法:類別的行為動作。就像人類有著會跑會跳的行為,而跑、跳就是人類的方法。

物件

物件就是把抽象變成現實就等於把類別實體化為物件,而物件就是實體存在的東西,有了實體就可以加以運用其內部的成員。

例如:「金正恩」的類別裡有個方法叫「發射核彈」,那你如果想發射看看核彈就必須先成為真正的金正恩才可以發射,也就是你必須實體化金正恩這個類別,當你實體化之後才能使用這個類別定義的成員。
Ex:

三大特性

封裝(Encapsulation)

把一個物件成員裝在一個空間裡面,概念就好比方法,把程式要執行的邏輯裝在一個函式裡面,就代表著使用的人只需要呼叫這個方法取得結果,而不用去了解方法內部寫的邏輯,例如:我們要開燈時只需按下開關,電燈就能亮了,而不用去理解背後線路是如何去設計實現的,也就是把背後線路原理封裝在開關上,而我們只需要去呼叫開關,即可實現開關燈功能,也就是說,只要封裝內的功能符合期待的結果即可,呼叫端只負責用。

Ex:
把燈泡變亮的原理封裝在 Open 方法

繼承(Inheritance)

像是類別繼承類別,被繼承方俗稱 父類別,繼承方俗稱 子類別,當子類繼承父類時,子類會擁有父類內的所有成員,而子類當然也可以被其他類別繼承,如此延續下去形成一個繼承練,主要是用於擴展與減少重複性程式碼,但盡量不要超過三層,過長的繼承鏈,反而會造成程式碼強耦合且不易維護,意思就是在父類別改了一個邏輯而牽扯到的部份可能很廣(甚至影響孫類、曾孫類...等等),要小心服用!

Ex:

多型(Polymorphism)

顧名思義可以解釋為同樣的東西可以有多種型態,也就是通過繼承讓子類衍伸出跟父類不同的型態,白話點就是子類繼承父類,父類有的成員子類當然都有,而父類跟子類其實是同樣的東西,而子類又可以自己定義新的成員變化成跟父類不同的型態,也就是多型的概念,還有其他幾種常見的呈現方式:

  • 當子類繼承父類後,子類可把從父類繼承過來的方法重新定義但方法名稱保持不變,這樣的行為稱為 覆寫-Override
  • 同樣的方法名稱可以藉由不同的參數型別或是參數個數來達到不同的實作,換言之,只要參數的資料型態或數目不同那就可以允許有同個方法名稱的存在,這樣的行為稱為 多載-Overload
    總之,一句話了解多型的使用方式 「同一件事因為要面對不同情況所以需要衍生出不同的做法」。

Ex:

覆寫

多載

總結

由此可見,使用物件導向設計對程式碼有著良好的擴展及靈活性還可以減少程式碼的重用,也對我們在開發上帶來莫大的便利。

安德魯的部落格曾留言提到過:「OOP 的核心就是善用封裝、繼承、多型的機制,讓程式碼能夠盡可能的模擬現實世界怎麼處理事情的,讓你的系統運作盡量貼近實際的世界。」

讓我覺得非常貼切,在這邊分享給大家。

心得

隨著寫程式也寫了一年多,覺得 OOP 就是個理所當然的東西,雖然時刻都在接觸,但被問到物件導向是什麼?卻也講不出個所以然,藉此文整理知識順便讓自己更加了解什麼是 OOP!